package com.xjzd.std.concurrency;

import java.util.concurrent.atomic.AtomicStampedReference;

/**
 * <p>JMM：Java Memory Model，为了解决各种硬件和操作系统带来的差异，统一的Java内存模型</p>
 *
 * <p>JMM规定所有变量都会存储在主内存中，在操作的时候需要从主内存复制一份到线程内存（CPU内存），在线程内部做计算，再写回到主内存（不一定）</p>
 *
 * <p>原子性：一个操作是不可分割的，不可中断的，一个线程在执行时，另一个线程不能影响</p>
 *
 * <p>
 * 1. synchronized <br>
 * 2. CAS：CPU并发原语。它在替换内存的某个位置的值时，首先查看内存中的值与预期值是否一致，如果一致，执行替换操作。
 * 这个操作是原子性操作。Java中基于Unsafe类提供了对CAS操作的方法，JVM会帮助我们将方法实现成CAS汇编指令。只针对某个变量。<br>
 * 问题：<br>
 * ABA：引入版本号。Java中提供一个类在CAS时，追加版本号操作。（自旋锁，自适应锁）<br>
 * 自旋时间过长：1.可以指定CAS一共循环多少次，如果超过这个次数，直接失败即可。2.CAS失败后，将这个操作暂存起来，后面需要获取结果时，将暂存的操作全部执行，再返回<br>
 * 3. Lock锁：JDK5引入，JDK6优化了synchronized和Lock性能相关不大 <br>
 * 4. ThreadLocal
 * </p>
 */
public class Feature1Atomic {

    public static void main(String[] args) {
        AtomicStampedReference<String> reference = new AtomicStampedReference<>("AAA", 1);

        String oldValue = reference.getReference();
        int oldVersion = reference.getStamp();

        boolean b = reference.compareAndSet(oldValue, "BBB", oldVersion, oldVersion + 1);
        System.out.println("修改1版本："  + b);
        boolean c = reference.compareAndSet(oldValue, "BBB", 2, 2 + 1);
        System.out.println("修改2版本："  + c);
    }
}
